Cavity Scattering with Phase Noise

Cavity phase noise leads to scattering into several orthogonal temporal modes. In this example, we determine the four most populated modes of a single photon scattered on a one-sided cavity. The input pulse is in a Gaussian temporal mode with width $\tau$. The cavity has a decay rate of $\gamma$ and a dephasing rate of $\gamma_p$. This system is described in A. Kiilerich, et al., Phys. Rev. A 102, 023717 (2020).

We start by loading the packages and defining the symbolic operators and parameters.

using QuantumInputOutputusing SecondQuantizedAlgebrausing QuantumOpticsusing QuantumOpticsBase: daggerusing Plotsusing LaTeXStringsusing LinearAlgebra
# symbolic Hilbert spaceshu1 = FockSpace(:u1)hc1 = FockSpace(:c1)h = hu1 ⊗ hc1# symbolic operatorsau = Destroy(h, :a_u, 1)c = Destroy(h, :c, 2)# symbolic parameters@variables γ::Real Δ::Real γ_p::Real g_u::Number g_v::Number

We use the symbolic operators and parameters to define the SLH triples and cascade them to obtain the Hamiltonian and Lindblad for the system.

G_u = SLH(1, g_u'*au, 0) # input cavityG_c = SLH(1, √(γ)*c, Δ*c'c) # scattering cavityG_cas = ▷(G_u, G_c)
H = hamiltonian(G_cas)
(-0.5conj(g_u)*sqrt(γ))im * a_u * c' + (0.5g_u*sqrt(γ))im * a_u' * c + Δ * c' * c
L = jump_operator(G_cas)[1] # only one jump operator in this example
conj(g_u) * a_u + sqrt(γ) * c
# numerical parameters, functions and operatorsγ_ = 1.0γ_p_ = 1.5γ_Δ_ = 0.0p_sym = [γ, Δ, γ_p]p_num = [γ_, Δ_, γ_p_]dict_p = Dict(p_sym .=> p_num)# Gaussian input pulseτ = 1.0;tp = 4τu(t) = 1/(sqrt(τ)*π^(1/4)) * exp(-(t - tp)^2 / (2*τ^2))T = [0:0.002:1;]*14τΔT = T[2] - T[1]gu_ = coupling_input(u, T)dict_p_t = Dict(g_u => gu_)# numeric basesbu1 = FockBasis(1)bc1 = FockBasis(1)b = bu1 ⊗ bc1au_qo = to_numeric(au, b)c_qo = to_numeric(c, b)cdc_qo = c_qo'c_qo# translate to numeric Hamiltonian and LindbladH_QO = to_numeric(H, b; parameter = dict_p, time_parameter = dict_p_t)L_QO = to_numeric(L, b; parameter = dict_p, time_parameter = dict_p_t)

We additionally include a cavity dephasing term and solve the dynamics.

function input_output(t, ρ)    H = H_QO(t)    J = [L_QO(t), √(γ_p_)*cdc_qo]    return H, J, dagger.(J)end;# time evolutionψ0 = fockstate(bu1, 1) ⊗ fockstate(bc1, 0)t_, ρt = timeevolution.master_dynamic(T, ψ0, input_output)

We calculate the two-time autocorrelation function $g^{(1)}(t_1,t_2) = \langle L_s^\dagger(t_1) L_s(t_2) \rangle$ and diagonalize the matrix to obtain the eigenvalues with the corresponding eigenvectors. The eigenvalues correspond to the mean photon number $n_i$ in the corresponding temporal eigenvector mode $v_i$.

Ls(t) = (gu_(t))'*au_qo + √(γ_)*c_qog1_m = correlation_matrix(T, ρt, input_output, Ls);
p = heatmap(    T,    T,    real.(g1_m);    c = :inferno,    xlabel = L"\gamma t_2",    ylabel = L"\gamma t_1",    colorbar_title = L"g^{(1)}(t_1,t_2)",    size = (450, 350),)p

The eigenvalues and corresponding eigenvectors are sorted in ascending order, which means the last eigenvalue corresponds to the highest populated temporal mode.

F = eigen(g1_m)n_avg = round.(real.(F.values)*ΔT; digits = 2)modes = F.vectorsv_t(i) = modes[:, end-i+1] / √(ΔT)
colors = [:blue, :red, :green, :black]p = plot()for i = 1:4    plot!(p, T, real.(v_t(i)); color = colors[i], label = "n$(i)=$(n_avg[end-i+1])")endplot!(p; xlabel = "time (1/γ)", legend = :best, size = (500, 350))p

We want to note that the temporal modes and average photon numbers are different to the ones in the paper A. Kiilerich, et al., Phys. Rev. A 102, 023717 (2020) due to a typo in their numerical model.

Package versions

These results were obtained using the following versions:

using InteractiveUtilsversioninfo()using PkgPkg.status(    [        "QuantumInputOutput",        "SecondQuantizedAlgebra",        "QuantumOptics",        "Plots",        "LaTeXStrings",    ],    mode = PKGMODE_MANIFEST,)
Julia Version 1.13.0
Commit d1c37793dd2 (2026-09-09 19:00 UTC)
Build Info:
  Official https://julialang.org release
Platform Info:
  OS: Linux (x86_64-linux-gnu)
  CPU: 4 × AMD EPYC 7763 64-Core Processor
  WORD_SIZE: 64
  LLVM: libLLVM-20.1.8 (ORCJIT, znver3)
  GC: Built with stock GC
Threads: 1 default, 0 interactive, 1 GC (on 4 virtual cores)
Environment:
  JULIA_PKG_SERVER_REGISTRY_PREFERENCE = eager
  JULIA_DEBUG = Documenter,Literate
  JULIA_NUM_THREADS = 1
Status `~/work/QuantumInputOutput.jl/QuantumInputOutput.jl/docs/Manifest.toml`
⌅ [7d9fca2a] Arpack v0.5.3
⌅ [861a8166] Combinatorics v1.0.2
  [d38c429a] Contour v0.6.3
⌅ [82cc6244] DataInterpolations v9.5.0
  [459566f4] DiffEqCallbacks v4.19.4
  [77a26b50] DiffEqNoiseProcess v5.36.4
  [c87230d0] FFMPEG v0.4.5
  [7a1cc6ca] FFTW v1.10.0
⌅ [53c48c17] FixedPointNumbers v0.8.6
  [069b7b12] FunctionWrappers v1.1.3
  [28b8d3ca] GR v0.73.27
  [42fd0dbc] IterativeSolvers v0.9.4
  [1019f520] JLFzf v0.1.11
  [682c06a0] JSON v1.9.0
  [0b1a1467] KrylovKit v0.10.4
  [b964fa9f] LaTeXStrings v1.4.1
  [23fbe1c1] Latexify v0.16.12
  [7a12625a] LinearMaps v3.11.4
  [442fdcdd] Measures v0.3.3
  [d8a4904e] MutableArithmetics v1.8.1
  [77ba4419] NaNMath v1.1.4
  [e7bfaba1] NumericalIntegration v0.3.4
  [1dea7af3] OrdinaryDiffEq v7.8.1
  [1344f307] OrdinaryDiffEqLowOrderRK v2.2.5
  [ccf2f8ad] PlotThemes v3.3.0
  [995b91a9] PlotUtils v1.5.0
  [91a5bcdd] Plots v1.41.7
  [aea7be01] PrecompileTools v1.3.4
  [18f9eda6] QuantumInputOutput v0.5.3 `~/work/QuantumInputOutput.jl/QuantumInputOutput.jl`
  [5717a53b] QuantumInterface v0.4.4
  [6e0679c1] QuantumOptics v1.2.10
  [4f57444f] QuantumOpticsBase v0.5.16
  [3cdcf5f2] RecipesBase v1.3.4
  [01d81517] RecipesPipeline v0.6.12
  [731186ca] RecursiveArrayTools v4.5.3
  [189a3867] Reexport v1.2.2
  [05181044] RelocatableFolders v1.0.1
  [ae029012] Requires v1.3.1
  [0bca4576] SciMLBase v3.56.1
  [431bcebd] SciMLPublic v1.3.0
  [6c6a2e73] Scratch v1.3.0
⌅ [f7aa4685] SecondQuantizedAlgebra v0.11.0
  [992d4aef] Showoff v1.1.1
  [276daf66] SpecialFunctions v2.9.0
  [90137ffa] StaticArrays v1.9.22
  [10745b16] Statistics v1.11.5
  [2913bbd2] StatsBase v0.34.13
  [789caeaf] StochasticDiffEq v7.2.0
  [d1185830] SymbolicUtils v4.48.0
  [0c5d862f] Symbolics v7.41.1
  [8ea1fca8] TermInterface v2.0.0
  [1cfade01] UnicodeFun v0.4.1
  [41fe7b60] Unzip v0.2.0
  [2a0f44e3] Base64 v1.11.0
  [ade2ca70] Dates v1.11.0
  [f43a241f] Downloads v1.7.0
  [37e2e46d] LinearAlgebra v1.13.0
  [44cfe95a] Pkg v1.13.0
  [de0858da] Printf v1.11.0
  [3fa0cd96] REPL v1.11.0
  [9a3f8284] Random v1.11.0
  [2f01184e] SparseArrays v1.13.0
  [fa267f1f] TOML v1.0.3
  [cf7118a7] UUIDs v1.11.0
Info Packages marked with ⌅ have new versions available but compatibility constraints restrict them from upgrading. To see why use `status --outdated -m`

This page was generated using Literate.jl.